// 漏洞管理模型包
// 该包定义了漏洞管理系统的核心数据模型，包括漏洞、附件、评论、时间线等
package models

import (
	"time" // 导入时间包，用于时间字段处理
)

// Vulnerability结构体定义漏洞表的数据模型
// 这是漏洞管理系统的核心实体，包含漏洞的完整生命周期信息
type Vulnerability struct {
	ID            uint             `gorm:"primary_key" json:"id"`                   // 漏洞唯一标识符，主键
	Title         string           `gorm:"not null;size:255" json:"title"`          // 漏洞标题，不能为空，最大255字符
	VulnURL       string           `gorm:"size:500" json:"vuln_url"`                // 漏洞地址，最大500字符
	Description   string           `gorm:"type:text" json:"description"`            // 漏洞详细描述，长文本类型，支持Markdown格式
	VulnType      string           `gorm:"size:50" json:"vuln_type"`                // 漏洞类型，如SQL注入、XSS、命令执行等
	Severity      string           `gorm:"size:20" json:"severity"`                 // 漏洞严重程度：critical严重、high高危、medium中危、low低危、info提示
	Status        string           `gorm:"size:20;default:'unfixed'" json:"status"` // 漏洞状态：unfixed未修复、fixing修复中、fixed已修复、retesting复测中、completed已完成、ignored已忽略
	CVEID         string           `gorm:"size:50" json:"cve_id"`                   // CVE编号，国际通用漏洞编号
	FixSuggestion string           `gorm:"type:text" json:"fix_suggestion"`         // 修复建议，漏洞的解决方法
	ProjectID     uint             `json:"project_id"`                              // 关联项目ID，外键
	Project       Project          `gorm:"foreignkey:ProjectID" json:"project"`     // 关联的项目对象
	AssetID       uint             `json:"asset_id"`                                // 关联资产ID，外键
	Asset         Asset            `gorm:"foreignkey:AssetID" json:"asset"`         // 关联的资产对象
	ReporterID    uint             `json:"reporter_id"`                             // 报告人ID，外键（安全工程师）
	Reporter      User             `gorm:"foreignkey:ReporterID" json:"reporter"`   // 报告人用户对象
	AssigneeID    *uint            `json:"assignee_id"`                             // 指派人ID，外键，可为空（研发工程师）
	Assignee      *User            `gorm:"foreignkey:AssigneeID" json:"assignee"`   // 指派人用户对象，可为空
	FixedBy       *uint            `json:"fixed_by"`                                // 修复人ID，外键，可为空
	Fixer         *User            `gorm:"foreignkey:FixedBy" json:"fixer"`         // 修复人用户对象，可为空
	RetesterID    *uint            `json:"retester_id"`                             // 复测人ID，外键，可为空（安全工程师）
	Retester      *User            `gorm:"foreignkey:RetesterID" json:"retester"`   // 复测人用户对象，可为空
	SubmittedAt   time.Time        `json:"submitted_at"`                            // 提交时间，漏洞被提交的时间
	AssignedAt    *time.Time       `json:"assigned_at"`                             // 指派时间，漏洞被指派的时间，可为空
	FixStartedAt  *time.Time       `json:"fix_started_at"`                          // 开始修复时间，可为空
	FixedAt       *time.Time       `json:"fixed_at"`                                // 修复完成时间，可为空
	RetestAt      *time.Time       `json:"retest_at"`                               // 复测时间，漏洞复测的时间，可为空
	CompletedAt   *time.Time       `json:"completed_at"`                            // 完成时间，漏洞流程完成的时间，可为空
	IgnoredAt     *time.Time       `json:"ignored_at"`                              // 忽略时间，漏洞被忽略的时间，可为空
	IgnoreReason  string           `gorm:"type:text" json:"ignore_reason"`          // 忽略原因，漏洞被忽略的原因说明
	RejectedAt     *time.Time       `json:"rejected_at"`                              // 驳回时间，漏洞被驳回的时间，可为空
	RejectedBy     *uint            `json:"rejected_by"`                              // 驳回人ID，外键，可为空（研发工程师）
	Rejector       *User            `gorm:"foreignkey:RejectedBy" json:"rejector"`    // 驳回人用户对象，可为空
	RejectReason   string           `gorm:"type:text" json:"reject_reason"`           // 驳回原因，漏洞被驳回的原因说明
	ResubmittedAt  *time.Time       `json:"resubmitted_at"`                           // 重新提交时间，漏洞被重新提交的时间，可为空
	ResubmittedBy  *uint            `json:"resubmitted_by"`                           // 重新提交人ID，外键，可为空（安全工程师）
	Resubmitter    *User            `gorm:"foreignkey:ResubmittedBy" json:"resubmitter"` // 重新提交人用户对象，可为空
	FixDeadline    *time.Time       `json:"fix_deadline"`                             // 修复截止时间，可为空
	RetestResult  string           `gorm:"type:text" json:"retest_result"`          // 复测结果，复测的详细结果说明
	Tags          string           `gorm:"size:500" json:"tags"`                    // 漏洞标签，用逗号分隔的标签列表
	Attachments   []VulnAttachment `gorm:"foreignkey:VulnID" json:"attachments"`    // 关联的附件列表
	Comments      []VulnComment    `gorm:"foreignkey:VulnID" json:"comments"`       // 关联的评论列表
	Timeline      []VulnTimeline   `gorm:"foreignkey:VulnID" json:"timeline"`       // 关联的时间线列表
	CreatedAt     time.Time        `json:"created_at"`                              // 创建时间，GORM自动管理
	UpdatedAt     time.Time        `json:"updated_at"`                              // 更新时间，GORM自动管理
	DeletedAt     *time.Time       `sql:"index" json:"deleted_at"`                  // 删除时间，软删除标记
}

// VulnAttachment结构体定义漏洞附件表的数据模型
// 用于存储漏洞相关的文件附件，如截图、报告等
type VulnAttachment struct {
	ID        uint      `gorm:"primary_key" json:"id"`               // 附件唯一标识符，主键
	VulnID    uint      `json:"vuln_id"`                             // 关联漏洞ID，外键
	FileName  string    `gorm:"size:255" json:"file_name"`           // 文件名，最大255字符
	FilePath  string    `gorm:"size:500" json:"file_path"`           // 文件存储路径，最大500字符
	FileSize  int64     `json:"file_size"`                           // 文件大小，以字节为单位
	MimeType  string    `gorm:"size:100" json:"mime_type"`           // 文件MIME类型，如image/png
	UploadBy  uint      `json:"upload_by"`                           // 上传者ID，外键
	Uploader  User      `gorm:"foreignkey:UploadBy" json:"uploader"` // 上传者用户对象
	CreatedAt time.Time `json:"created_at"`                          // 创建时间，GORM自动管理
}

// VulnComment结构体定义漏洞评论表的数据模型
// 用于存储漏洞处理过程中的评论和讨论
type VulnComment struct {
	ID        uint      `gorm:"primary_key" json:"id"`         // 评论唯一标识符，主键
	VulnID    uint      `json:"vuln_id"`                       // 关联漏洞ID，外键
	Content   string    `gorm:"type:text" json:"content"`      // 评论内容，长文本类型
	UserID    uint      `json:"user_id"`                       // 评论者ID，外键
	User      User      `gorm:"foreignkey:UserID" json:"user"` // 评论者用户对象
	CreatedAt time.Time `json:"created_at"`                    // 创建时间，GORM自动管理
	UpdatedAt time.Time `json:"updated_at"`                    // 更新时间，GORM自动管理
}

// VulnTimeline结构体定义漏洞时间线表的数据模型
// 用于记录漏洞处理过程中的关键时间节点和操作
type VulnTimeline struct {
	ID          uint      `gorm:"primary_key" json:"id"`         // 时间线唯一标识符，主键
	VulnID      uint      `json:"vuln_id"`                       // 关联漏洞ID，外键
	Action      string    `gorm:"size:50" json:"action"`         // 操作类型：created创建、assigned分配、fixed修复、closed关闭、reopened重新开启
	Description string    `gorm:"size:255" json:"description"`   // 操作描述，最大255字符
	UserID      uint      `json:"user_id"`                       // 操作者ID，外键
	User        User      `gorm:"foreignkey:UserID" json:"user"` // 操作者用户对象
	CreatedAt   time.Time `json:"created_at"`                    // 创建时间，GORM自动管理
}

// VulnCategory结构体定义漏洞分类表的数据模型
// 用于对漏洞进行分类管理，支持层级结构
type VulnCategory struct {
	ID          uint           `gorm:"primary_key" json:"id"`                // 分类唯一标识符，主键
	Name        string         `gorm:"unique;not null;size:100" json:"name"` // 分类名称，唯一且不能为空，最大100字符
	Code        string         `gorm:"unique;not null;size:50" json:"code"`  // 分类代码，唯一且不能为空，用于程序逻辑判断
	Description string         `gorm:"size:255" json:"description"`          // 分类描述，最大255字符
	ParentID    *uint          `json:"parent_id"`                            // 父分类ID，可为空，用于构建层级结构
	Parent      *VulnCategory  `gorm:"foreignkey:ParentID" json:"parent"`    // 父分类对象，可为空
	Children    []VulnCategory `gorm:"foreignkey:ParentID" json:"children"`  // 子分类列表
	Level       int            `gorm:"default:1" json:"level"`               // 分类层级，默认为1
	Sort        int            `gorm:"default:0" json:"sort"`                // 排序权重，默认为0
	Status      int            `gorm:"default:1" json:"status"`              // 分类状态，1=启用，0=禁用，默认启用
	CreatedAt   time.Time      `json:"created_at"`                           // 创建时间，GORM自动管理
	UpdatedAt   time.Time      `json:"updated_at"`                           // 更新时间，GORM自动管理
}

// 数据库表名设置方法
// GORM会调用这些方法来确定实际的数据库表名

// Vulnerability模型对应的数据库表名
func (Vulnerability) TableName() string {
	return "vulnerabilities"
}

// VulnAttachment模型对应的数据库表名
func (VulnAttachment) TableName() string {
	return "vuln_attachments"
}

// VulnComment模型对应的数据库表名
func (VulnComment) TableName() string {
	return "vuln_comments"
}

// VulnTimeline模型对应的数据库表名
func (VulnTimeline) TableName() string {
	return "vuln_timeline"
}

// VulnCategory模型对应的数据库表名
func (VulnCategory) TableName() string {
	return "vuln_categories"
}
